﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<assert.h>
//写一个二分查找函数
//功能：在一个升序数组中查找指定的数值，找到了就返回下标，找不到就返回 - 1.
//int bin_search(int arr[], int left, int right, int key)
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
//int bin_search(int arr[], int left, int right, int key)
//{
//	while (left <= right)
//	{
//		int mid = left + (right - left) / 2;
//		if (key > *(arr + mid))
//			left = mid + 1;
//		else if (key < *(arr + mid))
//			right = mid - 1;
//		else
//			return mid;
//	}
//	return -1;
//}
//int main()
//{
//	int key = 0;
//	scanf("%d", &key);
//	int arr[] = { 1,2,3,4,5,6,7,8,9 };
//	int left = 0;
//	int right = sizeof(arr) / sizeof(arr[0]) - 1;
//	int ret= bin_search(arr, left, right, key);
//	if (ret >= 0)
//		printf("找到了，下标是%d\n", ret);
//	else
//		printf("找不到\n");
//	return 0;
//}

//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定
//如：输入9，输出9 * 9口诀表，输出12，输出12 * 12的乘法口诀表。
//void print_table(int n)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1;i <= n;i++)
//	{
//		for (j = 1;j <= i;j++)
//		{
//			printf("%2d*%2d=%3d ", j, i, j * i);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	print_table(n);
//	return 0;
//}

//实现函数判断year是不是润年。
//void is_leap_year(int year)
//{
//	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//	{
//		printf("%d年是闰年\n", year);
//	}
//	else
//	{
//		printf("%d年不是闰年\n", year);
//	}
//}
//int main()
//{
//	int year = 0;
//	scanf("%d", &year);
//	is_leap_year(year);
//	return 0;
//}

//实现一个函数is_prime，判断一个数是不是素数。
//利用上面实现的is_prime函数，打印100到200之间的素数。
//void is_prime(int n)
//{
//	if (n == 2)
//		printf("%d ", n);
//	if(n > 2)
//	{
//		int i = 0;
//		int flag = 1;//flag=1表示n是素数
//		for (i = 2;i <= sqrt(n);i++)
//		{
//			if (n % i == 0)
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag)
//			printf("%d ", n);
//	}
//}
//int main()
//{
//	int i = 0;
//	for (i = 101;i < 200;i+=2)
//	{
//		is_prime(i);
//	}
//	return 0;
//}

//创建一个整形数组，完成对数组的操作
//实现函数init() 初始化数组为全0
//实现print()  打印数组的每个元素
//实现reverse()  函数完成数组元素的逆置。
//要求：自己设计以上函数的参数，返回值。
//void init(int* arr,int sz)
//{
//	int i = 0;
//	for (i = 0;i < sz;i++)
//	{
//		*(arr+i) = 0;
//	}
//}
//void print(int* arr, int sz)
//{
//	int i = 0;
//	for (i = 0;i < sz;i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//}
//void reverse(int* arr, int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//	while (left < right)
//	{
//		int temp = *(arr + left);
//		*(arr + left) = *(arr + right);
//		*(arr + right) = temp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	init(arr, sz);
//	print(arr, sz);
//	reverse(arr, sz);
//	return 0;
//}


// 求最大公因数及最小公倍数

// 1.若a,b的最大公因数是 c,则 a,b 的最小公倍数 d = a * b / c
// 2.暴力求解最大公因数及最小公倍数（循环遍历）
// 3.最大公因数 用辗转相除法，（a,b)==(b,a%b);若前者/后者为整数时，后者即为最大公因数
// 4.最小公倍数 m = a * i,遍历i,若 m / b == 0,则m就是最小公倍数
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int mul = a * b;
//	int x = a;
//	int y = b;
//	int max = a > b ? a : b;
//	while (a % b)
//	{
//		int c = a;
//		a = b;
//		b = c % b;
//	}
//	printf("%d和%d的求最小公因数为：%d\n", x, y, b); 
//	printf("%d和%d的求最小公倍数为：%d\n", x, y, mul/b);
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int i = 1;
//	while (1)
//	{
//		if (a * i % b == 0)
//		{
//			break;
//		}
//		i++;
//	}
//	printf("%d和%d的求最小公倍数为：%d\n", a, b, a*i);
//	return 0;
//}

//输入I like beijing 要求输出beijing like I
//先逆序得到      gnijieb ekil I 
//再单个逆序得到  beijing like I
//void reverse(char* left, char* right)
//{
//	assert(left);
//	assert(right);
//	while (right - left >= 1)//地址相减等于元素的个数，地址也可以比较大小(left<right)
//	{                        //&arr[9]-&arr[0]=9
//		char temp = *left;
//		*left = *right;
//		*right = temp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	char arr[101] = { 0 };
//	gets(arr);
//	printf("%s\n", arr);
//	int len = strlen(arr);
//	reverse(arr, arr + len - 1);//逆序字符串
//	printf("%s\n", arr);
//	//先逆序得到      gnijieb ekil I
//    //再单个逆序得到  beijing like I
//	/*int i = 0;
//	int j = 0;
//	while (i <= len)
//	{
//		if (*(arr + i) == ' ')
//		{
//			reverse(arr + j, arr + i - 1);
//			j = i + 1;
//		}
//		i++;
//	}*/
//	//先逆序得到      gnijieb ekil I
//	//再单个逆序得到  beijing like I
//
//	char* start = arr;
//	while (*start!='\0')
//	{
//		char* end = start;
//		while (*end != ' ' && *end != '\0')
//		{
//			end++;
//		}
//		reverse(start, end - 1);
//		if (*end != '\0')
//		{
//			end++;
//		}
//		start = end;
//	}
//	printf("%s\n", arr);
//	return 0;
//}

//1.递归打印字符串逆序
//void reverse(char* str)
//{
//	int len = strlen(str);
//	char temp = *str;
//	*str = *(str + len - 1);
//	*(str + len - 1) = '\0';
//	if (strlen(str + 1) > 1)
//	{
//		reverse(str + 1);
//	}
//	*(str + len - 1) = temp;
//}
//int main()
//{
//	char arr[] = "abcdefg";//{a b c d e f g \0}
//	reverse(arr);
//	printf("%s\n", arr);
//	return 0;
//}

//2.递归打印字符串逆序
//void reverse(char* left,char* right)
//{
//	char temp = *left;
//	*left = *right;
//	*right = temp;
//	left++;
//	right--;
//	if (left < right)
//	{
//		reverse(left, right);
//	}
//}
//int main()
//{
//	char arr[] = "abcdefg";//{a b c d e f \0}
//	int len = strlen(arr);
//	reverse(arr, arr + len - 1);
//	printf("%s\n", arr);
//	return 0;
//}

//3.递归打印字符串逆序
//void reverse(char* arr, int left,int right)
//{
//	char temp = *(arr+left);
//	*(arr+left) = *(arr+right);
//	*(arr+right) = temp;
//	left++;
//	right--;
//	if (left < right)
//	{
//		reverse(arr, left, right);
//	}
//}
//int main()
//{
//	char arr[] = "abcdefg";//{a b c d e f \0}
//	int len = strlen(arr);
//	int left = 0;
//	int right = len - 1;
//	reverse(arr, left, right);
//	printf("%s\n", arr);
//	return 0;
//}